package demo03;

/*
 *  哈希值：是一个十进制的整数，由系统随机给出（即对象的地址值，是一个逻辑地址，是模拟出来得到的地址，不是数据实际存储的物理地址）。
 *  在Object类中有一个方法，可以获取对象的哈希值：
 *      public int hashCode()：返回该对象的哈希码值
 *  hashCode方法的源码：
 *      public native int hashCode();
 *      native：代表该方法调用的是本地操作系统的方法
 */
public class Demo01HashCode {
    public static void main(String[] args) {
        // Person类继承了Object类，所以可以使用Object类的hashCode方法
        Person person = new Person();
        System.out.println(person.hashCode()); // 重写前：250075633，重写后：1
        Person person2 = new Person();
        System.out.println(person2.hashCode()); // 重写前：517938326，重写后：1

        /*
         *  toString方法的源码：
         *      return getClass().getName() + "@" + Integer.toHexString(hashCode());
         *      其返回内容包含了对象哈希值的十六进制形式
         */
        System.out.println(person); // 重写前：demo03.Person@ee7d9f1，重写后：demo03.Person@1
        System.out.println(person2); // 重写前：demo03.Person@1edf1c96，重写后：demo03.Person@1
        System.out.println(person == person2); // false，两个对象虽然哈希值相同，但其物理地址不相同

        /*
         *  String类的哈希值：String类重写了Object类的hashCode方法
         */
        String string = "abc";
        String string2 = "abc";
        System.out.println(string.hashCode()); // 96354
        System.out.println(string2.hashCode()); // 96354

        // 特殊的两个字符串：“重地”、“通话”，它们的哈希值相同
        System.out.println("重地".hashCode()); // 1179395
        System.out.println("通话".hashCode()); // 1179395
    }
}
